package top.jfunc.validation;

import top.jfunc.validation.core.ValidateHandler;
import top.jfunc.validation.core.Validator;

import java.lang.reflect.Constructor;

/**
 * ValidateValue
 * 可以继承此类添加自己的校验方法，可以使用{@link ValidateValue#with(Object, Class)}方法生成子类
 * @author xiongshiyan
 */
public class ValidateValue {

    protected Object value;

    protected ValidateValue(Object value) {
        this.value = value;
    }
    protected ValidateValue() {}

    public ValidateValue withValue(Object value) {
        this.value = value;
        return this;
    }

    /**
     * 新建校验实例，传入目标对象
     *
     * @param value 校验对象
     * @return ValidateValue
     */
    public static ValidateValue with(Object value) {
        return new ValidateValue(value);
    }

    /**
     * 新建 ValidateValue 子类实例，传入目标对象
     * @param value 需要校验的对象
     * @param validateValueChildClass 子类class
     * @param <T> 子类
     * @return 子类实例
     */
    public static <T extends ValidateValue> T with(Object value , Class<T> validateValueChildClass) {
        try {
            Constructor<? extends ValidateValue> constructor = validateValueChildClass.getConstructor(Object.class);
            return (T)constructor.newInstance(value);
        } catch (Exception e) {
            try {
                T t = validateValueChildClass.newInstance();
                t.withValue(value);
                return t;
            } catch (Exception e1) {
                throw new RuntimeException(e1);
            }
        }
    }

    /**
     * 切换目标对象，不重新创建实例
     *
     * @param value 校验对象
     * @return ValidateValue
     */
    public ValidateValue and(Object value) {
        this.value = value;
        return this;
    }

    /**
     * 非空校验
     *
     * @return ValidateValue
     */
    public ValidateValue notNull() {
        return notNull(null);
    }

    /**
     * 非空校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue notNull(String msg) {
        ValidateHandler.notNull(value, msg);
        return this;
    }

    /**
     * 正则校验
     *
     * @param regex 正则表达式
     * @return ValidateValue
     */
    public ValidateValue regex(String regex) {
        return regex(regex, null);
    }

    /**
     * 正则校验
     *
     * @param regex 正则表达式
     * @param msg   错误信息
     * @return ValidateValue
     */
    public ValidateValue regex(String regex, String msg) {
        ValidateHandler.regex(regex, value, msg);
        return this;
    }

    /**
     * 最大值校验
     *
     * @param max 最大值
     * @return ValidateValue
     */
    public ValidateValue max(Number max) {
        return max(max, null);
    }

    /**
     * 最大值校验
     *
     * @param max 最大值
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue max(Number max, String msg) {
        ValidateHandler.max(max, value, msg);
        return this;
    }

    /**
     * 最小值校验
     *
     * @param min 最小值
     * @return ValidateValue
     */
    public ValidateValue min(Number min) {
        return min(min, null);
    }

    /**
     * 最小值校验
     *
     * @param min 最小值
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue min(Number min, String msg) {
        ValidateHandler.min(min, value, msg);
        return this;
    }

    /**
     * 最大长度校验
     *
     * @param max 最大长度
     * @return ValidateValue
     */
    public ValidateValue maxLength(int max) {
        return maxLength(max, null);
    }

    /**
     * 最大长度校验
     *
     * @param max 最大长度
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue maxLength(int max, String msg) {
        ValidateHandler.maxLength(max, value, msg);
        return this;
    }

    /**
     * 最小长度校验
     *
     * @param min 最小长度
     * @return ValidateValue
     */
    public ValidateValue minLength(int min) {
        return minLength(min, null);
    }

    /**
     * 最小长度校验
     *
     * @param min 最小长度
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue minLength(int min, String msg) {
        ValidateHandler.minLength(min, value, msg);
        return this;
    }

    /**
     * 中文校验
     *
     * @return ValidateValue
     */
    public ValidateValue isChinese() {
        return isChinese(null);
    }

    /**
     * 中文校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue isChinese(String msg) {
        ValidateHandler.isChinese(value, msg);
        return this;
    }

    /**
     * 英文校验
     *
     * @return ValidateValue
     */
    public ValidateValue isEnglish() {
        return isEnglish(null);
    }

    /**
     * 英文校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue isEnglish(String msg) {
        ValidateHandler.isEnglish(value, msg);
        return this;
    }

    /**
     * 手机号校验
     *
     * @return ValidateValue
     */
    public ValidateValue isPhone() {
        return isPhone(null);
    }

    /**
     * 手机号校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue isPhone(String msg) {
        ValidateHandler.isPhone(value, msg);
        return this;
    }

    /**
     * 邮箱校验
     *
     * @return ValidateValue
     */
    public ValidateValue isEmail() {
        return isEmail(null);
    }

    /**
     * 邮箱校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue isEmail(String msg) {
        ValidateHandler.isEmail(value, msg);
        return this;
    }

    /**
     * 自定义日期格式校验
     *
     * @param format 格式
     * @return ValidateValue
     */
    public ValidateValue isDateMatch(String format) {
        return isDateMatch(format, null);
    }

    /**
     * 自定义日期格式校验
     *
     * @param format 格式
     * @param msg    错误信息
     * @return ValidateValue
     */
    public ValidateValue isDateMatch(String format, String msg) {
        ValidateHandler.isDateMatch(format, value, msg);
        return this;
    }

    /**
     * 身份证校验
     *
     * @return ValidateValue
     */
    public ValidateValue isIdCard() {
        return isIdCard(null);
    }

    /**
     * 身份证校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue isIdCard(String msg) {
        ValidateHandler.isIdCard(value, msg);
        return this;
    }

    /**
     * IP地址校验
     *
     * @return ValidateValue
     */
    public ValidateValue isIp() {
        return isIp(null);
    }

    /**
     * IP地址校验
     *
     * @param msg 错误信息
     * @return ValidateValue
     */
    public ValidateValue isIp(String msg) {
        ValidateHandler.isIp(value, msg);
        return this;
    }

    /**
     * 对象校验（通过注解）
     * @return ValidateValue
     */
    public ValidateValue checkBean() {
        ValidateHandler.checkBean(value);
        return this;
    }

    /**
     * 自定义校验
     * @param validator 校验器
     * @param extraArgs 额外的参数，通常是提示语
     * @return ValidateValue
     */
    public ValidateValue validate(Validator validator , Object... extraArgs){
        if(null != validator){
            validator.validate(value , extraArgs);
        }
        return this;
    }
}
